/**
 * @file:  	cn_game.h
 * @date:   2011/5/3
 * @session encoding: 	ISO 8859-2
 * @author: Zdeněk Coufal, xcoufa06@stud.fit.vutbr.cz
 * @author: Petr Bušina, xbusin01@stud.fit.vutbr.cz
 * @brief PROJECT:
 *    Projekt ICP: Člověče, nezlob se!
 * @brief DESCRIPTION:
 *
 */

#ifndef CN_GAME_H
#define CN_GAME_H

#define DEBUG

#include <vector>
#include "packet.h"

typedef struct SAccount
{
  std::string login;
  std::string password;
} SAccount;

typedef struct TPlayer
{
  int id;         // id hráče
  int type;       // typ hráče (neobsazen, počítač, člověk)
  std::string login;    // login
  std::string password;    // heslo
  int socket_id;  // socket pro komunikaci
  int fig[4];

  bool free;      // příznak, jestli je tento hráč ještě volný
  bool ready;     // příznak, že je připraven
  bool out;       // příznak, že skončil hru

} *TPlayerUk;

class TGame
{
  private:

    std::string p_pattern;            // vzor hracího pole
    int p_size;                       // velikost hracího pole
    bool loaded;                      // příznak zda-li se jedná o načtenou hru
    int on_draw;                      // hráč na tahu
    bool on_draw_again;               // příznak jestli bude vybrán stejný hráč v příštím tahu
    bool first_draw;
    TPlayer *p_actual;                // aktuální hráč
    struct TPlayer p_players[4];      // hráči
    std::vector<SAccount> p_accounts; // účty hráču na serveru

  public:

    // konstruktory, destruktory
    TGame(char *pattern, int size);
    TGame();
    ~TGame();

    // metody pro práci se složkou hráče
    void set_player(int id);
    void set_player_incredentials(int id, std::string login, std::string pswd, int type);
    void set_player_socket(int id, int socket);
    void set_player_ready(int id);
    void set_player_out(int id);
    void set_player_fig(int id, int fig_id, int value);
    int get_player_fig(int id, int fig_id);
    int get_player_socket(int id);
    int get_player_type(int id);
    bool is_player_out(int id);
    std::string get_player_login(int id);

    // metody pro práci se složkami hracího pole
    int get_size();
    std::string get_pattern();
    void set_game_plan(char *pattern, int size);

    // metody hry
    bool all_ready();
    int get_free_id();
    void set_id_nonfree(int id);
    bool game_full();
    bool game_loaded();
    int get_my_id(std::string login);
    int get_player_on_draw();
    bool all_out();
    void set_again_flag();
    int was_on_draw();

    // načtení a uložení
    int load_game(TPacket *packet);
    int save_game(TPacket *packet);

    // autentizace
    bool check_account(std::string login, std::string pswd);
    int get_accounts(const char * filename);
};

#endif // CN_GAME_H
